perm filename CALBOX.FAI[CMS,LCS] blob sn#471273 filedate 1979-09-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00004 00003	   Reset and interrupt vectors.
C00006 00004	INPUT WAIT.	Check upflg time?
C00008 00005	CKSPD:	CLRA	SPD default.
C00011 00006	CKJSC:	MOVRI	K,JSC
C00013 00007	CKJP:	SRB0	Select ram bank 0. Not active.
C00016 00008	 Output Acc. to SI/O line
C00018 00009	GETMES:	MOVRA	I
C00020 00010	 Bit spreading table
C00022 00011	   Format calbox values.
C00024 00012	Alfa led message table.
C00027 00013	("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100	Too close.
C00030 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

   ;Ram bank 0 registers.
	K ← 0
	I ← 1
	N ← 2
	T ← 3	;Timer overflow count.
	CMD ← 4	;TBOX and JS led bits.
	CMD1 ← 5	;Alfa led message index.
	OFFL ← 6	;Alfa off timer low.
	OFFH ← 7	;High.

   ;Ram10-27 = Stack.
   ;Ram bank 1 registers.
	P ← 30	;Pots pointer.
	O ← 31	;Offset pointer.
;	X ← 32
	Y ← 33
;	Z ← 34
	SW0 ← 35	;TBOX switch bits.
	SW1 ← 36
	SW2 ← 37

   ;Standard ram.
	SPD ← 40	;Speed pot.
	P0 ← 41	;Joy stick pots.
	P1 ← 42
	P2 ← 43
	P3 ← 44
	JW0 ← 45	;T.	Joy stick switch channels.
	JW1 ← 46	;P/O.
	JW2 ← 47	;TOOL.
	JW3 ← 50	;T/JS/C.

	OSPD ← 51	;Old speed pot.
	OP0 ← 52	;Joy stick offsets.
	OP1 ← 53
	OP2 ← 54
	OP3 ← 55
	OJSW ← 56	;Old joy stick switch bits.
	OCMD ← 57	;Old led bits.
	OCMD1 ← 60	;Old alfa led index.

	JSC ← 61	;Joy stick not calib. flag.

	XTAL ← =6000000	;In hertz.
	BRATE ← =9600	;Baud rate

;TBIT ← ((=10000000/BRATE)/((=10000000/XTAL)*=15))/2
	TBIT ← =21

	TT ← 1	;Triple throw switch port.
	S ← 2	;Scan and A/D port.
	PBL ← 4	;Push button port low.
	PBH ← 5	;Push button port high.
	CEW ← 6	;Alfa led chip enables and write port.
	JS ← 7	;Joy stick, CU, and led latch port.
   ;Reset and interrupt vectors.
	JMP	RST	;RESET VECTOR
	0
	DISXI		;EXTERNAL INTERRUPT VECTOR
	NOP
	NOP
	NOP
	DISTI		;TIMER INT VECTOR
	RETR

   ;Power on reset.
RST:	CLRA	;0 For clear cursor memory.
	OUTB	;Latch bus output.
	MOVI	377	;SETUP INPUT PORTS
	OUTP	TT	;SPTT switches.
	MOVI	77	;P4-7, SCAN, STRT, ALE.
	OUTP	S
   ;Setup PBSW ports for input.
	MOVAX	PBL	;PBSW low.
	MOVAX	PBH	;PBSW high.

   ;Clear cursor memory.
	MOVI	170	;7,,10.
	MOVAX	CEW	;Enable all alfa leds.
	SWAP	;A ← 207.
	MOVAX	JS	;Clear JS and CU.
   ;Write all alfa leds.
	ANPA	CEW	;NOT W
	CPLA
	ORPA	CEW	;W

	SWAP	;A ← 10,,7.
	ORPA	CEW	;Disable all alfa leds.
	SWAP	;A0-3 ← 10.
	ORPA	JS	;NOT CU.

	CALL	CLED	;Clear leds.
	CALL	CALED	;Clear alfa leds.

	MOVAT		;Setup timer.
	STRTT

	CPLF1	;Set alfa leds off.
	MOVRI	K,JSC
	MOVMI	K,4	;Set joy stick not calib.
	
	JMP	SETFLG

; Set scan flag and timer
UPFLG:	DJNZ	T,CKIN
SETFLG:	MOVRI	T,4	;4 = 82 ms.
	CLRF0		;Set scan flag

	JF1S	CKIN	;Check if alfa off.
	DJNZ	OFFL,CKIN	;OFFW ← OFFW - 1.
	DJNZ	OFFH,CKIN
	CPLF1	;Set alfa led off flag.
;INPUT WAIT.	Check upflg time?
   OFFSET ← TBIT/3	;Center delay?
INWAI:	JTF	UPFLG	;Check if timer time out.

CKIN:	JT0H	INWAI	;Check for start bit.

	MOVRI	K,OFFSET-4	;Center - Itime.
CENTER:	DJNZ	K,CENTER	;Wait for center of bit
	JT0H	INWAI	;Check if valid start bit

; Byte input routine
	MOVRI	N,11	;# of bits -1
ILOOP:	MOVRI	K,TBIT-5;tBIT - tI
WAI:	DJNZ	K,WAI
	CLRC
	JT0H	BITON
	RORC
	JMP	BITOFF
BITON:	CPLC
	RORC
	NOP

BITOFF:	DJNZ	N,ILOOP

	ROLC		;Shift out stop bit
	JCC	INWAI	;Check for good stop bit.

	JBS	7,BYTE1	;Check if first or second byte.
	MOVAR	CMD	;Save first input byte.
	JMP	INWAI	;Get next byte.

BYTE1:	MOVAR	CMD1	;Save second byte.

	MOVRI	K,JSC	;Point to calib flag.
	JINT	GETCB	;Check for calbox.
	MOVMI	K,4	;JSC ← 1.
	JMP	CKSPD

;A/D convert routines.
GETCB:	MOVMI	K,0	;JSC ← 0.
	MOVI	1	;Chanel 1.
	OUTB	;Latch bus output.
	ORPI	S,200	;ALE
	ANPI	S,177	;NOT ALE.

	MOVI	375	;NOT CLR bit.
	ANPA	JS	;NOT CLR.
	CPLA
	ORPA	JS	;CLR.
	MOVRI	P,P0	;JS pot index.
	MOVRI	N,10	;# of pots + switch channels.

ADLOOP:	CALL	CONVRT	;Wait for A/D.
	MOVAM	P	;Ram(p) ← Pots&sws(p).

	MOVI	376
	ANPA	JS	;NOT CNT.
	CPLA
	ORPA	JS	;CNT
	INCR	P	;Next pot.
	DJNZ	N,ADLOOP	;Next channel.
CKSPD:	CLRA	;SPD default.
	JT1H	ADZRO	;Speed off.

   ;A/DCHAN ← SPEED.
	OUTB	;Latch zero on bus.
	ORPI	S,200	;ALE.
	ANPI	S,177	;NOT ALE.

	CALL	CONVRT	;Wait for speed.

	JNZ	ADZRO	;Check if on and zero.
	INCA	;A ← 1.

ADZRO:	MOVRI	K,SPD	;Save speed pot value.
	MOVAM	K

	CALL	CLED	;Clear cal. and mode leds.
	MOVRA	CMD	;Get mode code.
	RORC	;Get cal. bit.
	ANI	7	;Zero data input to LS259.
	CALL	WLED	;Write mode led.

	JCC	CKSCAN	;No calib. bit.
	CLRA	;Led 0.
	CALL	WLED	;Write cal. led.

;Check for scan flag.
CKSCAN:	JF0S	CALJMP	;If not time to scan then format calbox values.

	JMP	SCAN	;Scan switches.

CALJMP:	JMP	GETCAL	;Jump to format calbox.
CKJSC:	MOVRI	K,JSC
	MOVMA	K	;A ← JSC.
	JBS	2,ZPOTS	;Check if calbox not calib.
	JMP	CKACT

ZPOTS:	CLRA
	MOVRI	P,P0
	MOVRI	N,4	;# of pots.
ZPL:	MOVAM	P	;Ram(Pots) ← 0.
	INCR	P
	DJNZ	N,ZPL

;Activity check.
CKACT:	MOVRI	K,OCMD
	MOVMA	K
	XORR	CMD	;A ← CMD .XOR. OCMD.
	JNZ	ACT
	MOVRI	K,OCMD1	;Old alfa index.
	MOVMA	K
	XORR	CMD1
	JNZ	ACT

	SRB1	;Select ram bank 1.
	MOVRA	SW0
	JNZ	RACT
	MOVRA	SW1
	JNZ	RACT
	MOVRA	SW2
	ANI	77	;Mask out JS and P/O bits.
	JNZ	RACT

	MOVRI	P,SPD	;Now pot index.
	MOVRI	O,OSPD	;Old pot index.
	MOVMA	P	;Check speed.
	XORM	O
	ANI	374	;Stablize.
	JZ	CKJP

RACT:	SRB0	;Select ram bank 0.
ACT:	JMP	ACTIVE
CKJP:	SRB0	;Select ram bank 0. Not active.
	CLRA	;Blank message index.
	JF1S	DPYJMP	;Check if alfa off.
	JMP	OBITS	;Not active.
DPYJMP:	JMP	ALFDPY	;Jump across page boundry.
UPRJMP:	JMP	UPPER	;Jump across page boundry.
FORJMP:	JMP	FORMT	;Jump across page boundry.

ACTIVE:	MOVRA	CMD	;OLD ← NEW.
	MOVRI	K,OCMD
	MOVAM	K	;OCMD.
	MOVRA	CMD1
	INCR	K
	MOVAM	K	;OCMD1.

	MOVRI	P,SPD
	MOVRI	O,OSPD
	MOVMA	P	;A ← SPD.
	MOVAM	O	;OSPD ← A.

	CLRF1	;Alfa led off flag ← 0.
	MOVRI	OFFH,10	;OFFW ← tOWAIT.

	MOVRA	CMD1	;Update alfa leds.
	JBS	4,UPRJMP;Check if mess. index is greater that 15.

	JBS	3,FORJMP;Check if not a limit stop.
	ANI	7	;Get joint number.
	JZ	DPYJMP	;Check if blank message.
	MOVAR	CMD1	;Set limit stop flag.
       ;Page \/ boundry.
	MOVI	1	;Point A to limit stop message.
       ;Page /\ boundry.

FORMT:	SWAP	;Shift etc.
	ANI	360	;For 16 messages.
ALFDPY:	CALL	OALFA	;Output message.

OBITS:	MOVRI	CMD1,0	;Init check sum.
	MOVRI	I,SW0	;Point to out bytes.
	MOVRI	CMD,11	;# of output bytes.

OUTL:	MOVMA	I	;Get output byte.
	CALL	OBYTE
	ADR	CMD1	;Add it to cksum.
	MOVAR	CMD1
	INCR	I
	DJNZ	CMD,OUTL

	MOVRA	CMD1
	CPLA
	INCA
	CALL	OBYTE	;Output check sum.

	JMP	INWAI	;Loop back to input wait.

UPPER:	CPLA
	ADDI	30	;Subtract the upper index offset.
	CPLA
	JNZ	FORMT	;Jump.
; Output Acc. to SI/O line
OBYTE:	MOVRI	K,11	;# of bits -1
	CLRC
	ROLC		;Start bit
OLOOP:	OUTP	TT	;Output bit
	RORC
	MOVRI	N,TBIT-3	;TBIT - Itime.

OWAIT:	DJNZ	N,OWAIT
	DJNZ	K,OLOOP

	ORPI	TT,377	;Stop bit.
	MOVRI	N,TBIT-10	;TBIT - Itime.
SWAIT:	DJNZ	N,SWAIT
	RORC
	RET

WLED:	OUTB	;Latch A on bus.
	MOVI	7	;NOT led E bit.
	ANPA	JS	;NOT E.
	CPLA
	ORPA	JS	;E.

	RET

;Clear leds
CLED:	MOVRI	N,370
	MOVRA	N	;Setup regs.
CLRL:	CALL	WLED	;Clear led loop.
	INCR	N	;Next led.
	MOVRA	N
	JNZ	CLRL

	RET

;Convert channel and wait.
CONVRT:	ORPI	S,100	;STRT.
	ANPI	S,277	;NOT STRT.

	MOVI	=22	;=172 micro seconds?
CONL:	DECA	;Convert wait.
	JNZ	CONL
	MOVXMA	K	;Get A/D output.
	MOVXMA	K	;Twice for bus unlatch.
	OUTB	;Latch bus for output.
	RET

;Alfa led output routines.
CALED:	CLRA	;Blank string index.
	MOVRI	CMD1,200;Clear limit stop message flag.

OALFA:	MOVAR	I	;Save string index.
	MOVI	376	;NOT CE0.

CENBL:	MOVRI	N,4	;# of chrs in package.
	MOVAR	K	;Save CE.
	MOVAX	CEW	;NOT CE.
GETMES:	MOVRA	I
	MOVP3	;A ← String(chr).

OUTALF:	OUTB	;Latch bus output.

	MOVI	367
	ANPA	CEW	;NOT W.
	CPLA
	ORPA	CEW	;W

	INCR	I	;CHR ← CHR+1.
	DJNZ	N,GETMES

	MOVRA	K
	ROL	;Next CE.
	JBS	3,CENBL

	XCHR	CMD1	;Save last CE and reset limit stop flag.
	JBS	7,CEOFF	;Return if not limit stop message.
	ORI	60	;Make joint number ascii.
	MOVRI	N,1
	JNZ	OUTALF	;Display the joint number.

CEOFF:	MOVRA	CMD1	;Restore last CE.
	ORPA	CEW	;CE.
	RET
; Bit spreading table
   LOC 1000	;1000 = Start of page two.
	125 ↔ 124 ↔ 121 ↔ 120 ↔ 105 ↔ 104 ↔ 101 ↔ 100
	 25 ↔  24 ↔  21 ↔  20 ↔   5 ↔   4 ↔   1 ↔   0
   SBITS ← 60	;Scan bits.
   ROW0 ← 357	;Scan row 0.
   ROW1 ← 337	;Scan row 1.

SCAN:	SRB1	;Select ram bank 1.
	CPLF0		;Reset scan flag.
	ORPI	S,SBITS	;Turn off rows
	ANPI	S,ROW0	;Enable row 0.
	INP	TT	;Scan row 0
	MOVAR	SW0	;Save it
	ANI	17	;Get low nibble
	MOVPD		;Get bits from spread table
	XCHR	SW0
	SWAP		;Swap high low nibbles
	ANI	17	;Get high nibble 
	MOVPD
	MOVAR	SW1

	ORPI	S,SBITS	;Turn off row 0.
	ANPI	S,ROW1	;Enable row 1.
	INP	TT	;Scan row 1
	ORPI	S,SBITS	;Disable scan.
	MOVAR	SW2	;Save row 1
	ANI	17	;Low nibble
	MOVPD
	ROL		;Shift + bits
	ORR	SW0	;Or into - bits
	ANI	374	;Clear teach and off bits.
	MOVAR	SW0
	MOVRA	SW2	;Get row 1 again
	SWAP
	ANI	17
	MOVPD
	ROL
	ORR	SW1
	MOVAR	SW1

	MOVXA	PBL	;Get push buttons.
	MOVAR	SW2	;Save low nibble.
	MOVXA	PBH
	SWAP	;High nibble.
	ORR	SW2

	CPLA
	MOVAR	SW2
	ANI	77	;Zero JS and P/O bits.
	XCHR	SW2
	ROLC		;Shift & swap teach & off bits
	ROL
	ROLC
	ANI	3
	ORR	SW0
	MOVAR	SW0

	JINT	GETCAL	;Check if calbox.
	SRB0	;Select ram bank 0.
	JMP	ZPOTS	;No joy stick.
   ;Format calbox values.
GETCAL:	SRB1	;Select ram bank 1.
	MOVRI	P,P0	;Point P to first calbox sign value.
	MOVRI	Y,0	;Clear sign bits word.
	MOVRI	N,4

RCAL:	MOVMA	P	;A ← cal pot.
	ROLC	;Get sign bit.
	MOVRA	Y
	RORC
	MOVAR	Y	;Format sign bits.
	INCR	P	;P ← P + 2.
	INCR	P
	DJNZ	N,RCAL

	MOVRI	P,P1	;Point P to first calbox pot value.
	MOVRI	O,P0	;Point O to position in output string.
	MOVRI	N,4

CALMOV:	MOVMA	P	;Move calbox pot value from input string
	MOVAM	O	;to output string.
	INCR	P	;P ← P + 2.
	INCR	P
	INCR	O	;O ← O + 1.
	DJNZ	N,CALMOV

	MOVRA	Y
	SWAP	;Put sign bits in low nibble of last byte in output string.
	MOVAM	O	;JW0 ← calbox sign bits.

	SRB0	;Select ram bank 0.
	JMP	CKJSC
;Alfa led message table.
   LOC 1400	;Start of page three.

(" "∧77)∨300 ↔ (" "∧77)∨200 ↔ (" "∧77)∨100	;<Blank>.
" "∧77 ↔ (" "∧77)∨300 ↔ (" "∧77)∨200
(" "∧77)∨100 ↔ " "∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("L"∧77)∨300 ↔ ("I"∧77)∨200 ↔ ("M"∧77)∨100	;Limit stop.
"I"∧77 ↔ ("T"∧77)∨300 ↔ (" "∧77)∨200
("S"∧77)∨100 ↔ "T"∧77 ↔ ("O"∧77)∨300
("P"∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("T"∧77)∨300 ↔ ("E"∧77)∨200 ↔ ("A"∧77)∨100	;Teach mode C.
"C"∧77 ↔ ("H"∧77)∨300 ↔ (" "∧77)∨200
("M"∧77)∨100 ↔ "O"∧77 ↔ ("D"∧77)∨300
("E"∧77)∨200 ↔ (" "∧77)∨100 ↔ "C"∧77
0 ↔ 0 ↔ 0 ↔ 0

("C"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("M"∧77)∨100	;Comp mode.
"P"∧77 ↔ (" "∧77)∨300 ↔ ("M"∧77)∨200
("O"∧77)∨100 ↔ "D"∧77 ↔ ("E"∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("X"∧77)∨300 ↔ ("X"∧77)∨200 ↔ ("X"∧77)∨100	;Serial I/O error.
"X"∧77 ↔ ("X"∧77)∨300 ↔ ("X"∧77)∨200
("X"∧77)∨100 ↔ "X"∧77 ↔ ("X"∧77)∨300
("X"∧77)∨200 ↔ ("X"∧77)∨100 ↔ "X"∧77
0 ↔ 0 ↔ 0 ↔ 0

("X"∧77)∨300 ↔ ("X"∧77)∨200 ↔ ("X"∧77)∨100	;Serial I/O error.
"X"∧77 ↔ ("X"∧77)∨300 ↔ ("X"∧77)∨200
("X"∧77)∨100 ↔ "X"∧77 ↔ ("X"∧77)∨300
("X"∧77)∨200 ↔ ("X"∧77)∨100 ↔ "X"∧77
0 ↔ 0 ↔ 0 ↔ 0

("X"∧77)∨300 ↔ ("X"∧77)∨200 ↔ ("X"∧77)∨100	;Serial I/O error.
"X"∧77 ↔ ("X"∧77)∨300 ↔ ("X"∧77)∨200
("X"∧77)∨100 ↔ "X"∧77 ↔ ("X"∧77)∨300
("X"∧77)∨200 ↔ ("X"∧77)∨100 ↔ "X"∧77
0 ↔ 0 ↔ 0 ↔ 0

("X"∧77)∨300 ↔ ("X"∧77)∨200 ↔ ("X"∧77)∨100	;Serial I/O error.
"X"∧77 ↔ ("X"∧77)∨300 ↔ ("X"∧77)∨200
("X"∧77)∨100 ↔ "X"∧77 ↔ ("X"∧77)∨300
("X"∧77)∨200 ↔ ("X"∧77)∨100 ↔ "X"∧77
0 ↔ 0 ↔ 0 ↔ 0
("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100	;Too close.
" "∧77 ↔ ("C"∧77)∨300 ↔ ("L"∧77)∨200
("O"∧77)∨100 ↔ "S"∧77 ↔ ("E"∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("T"∧77)∨300 ↔ ("O"∧77)∨200 ↔ ("O"∧77)∨100	;Too far.
" "∧77 ↔ ("F"∧77)∨300 ↔ ("A"∧77)∨200
("R"∧77)∨100 ↔ " "∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("T"∧77)∨300 ↔ ("E"∧77)∨200 ↔ ("A"∧77)∨100	;Teach mode J.
"C"∧77 ↔ ("H"∧77)∨300 ↔ (" "∧77)∨200
("M"∧77)∨100 ↔ "O"∧77 ↔ ("D"∧77)∨300
("E"∧77)∨200 ↔ (" "∧77)∨100 ↔ "J"∧77
0 ↔ 0 ↔ 0 ↔ 0

("M"∧77)∨300 ↔ ("A"∧77)∨200 ↔ ("N"∧77)∨100	;Manual mode.
"U"∧77 ↔ ("A"∧77)∨300 ↔ ("L"∧77)∨200
(" "∧77)∨100 ↔ "M"∧77 ↔ ("O"∧77)∨300
("D"∧77)∨200 ↔ ("E"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("N"∧77)∨300 ↔ ("O"∧77)∨200 ↔ (" "∧77)∨100	;No high pwr.
"H"∧77 ↔ ("I"∧77)∨300 ↔ ("G"∧77)∨200
("H"∧77)∨100 ↔ " "∧77 ↔ ("P"∧77)∨300
("W"∧77)∨200 ↔ ("R"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("P"∧77)∨300 ↔ ("R"∧77)∨200 ↔ ("O"∧77)∨100	;Prog running.
"G"∧77 ↔ (" "∧77)∨300 ↔ ("R"∧77)∨200
("U"∧77)∨100 ↔ "N"∧77 ↔ ("N"∧77)∨300
("I"∧77)∨200 ↔ ("N"∧77)∨100 ↔ "G"∧77
0 ↔ 0 ↔ 0 ↔ 0

("R"∧77)∨300 ↔ ("U"∧77)∨200 ↔ ("N"∧77)∨100	;Run hold.
" "∧77 ↔ ("H"∧77)∨300 ↔ ("O"∧77)∨200
("L"∧77)∨100 ↔ "D"∧77 ↔ (" "∧77)∨300
(" "∧77)∨200 ↔ (" "∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

("F"∧77)∨300 ↔ ("A"∧77)∨200 ↔ ("T"∧77)∨100	;Fatal error.
"A"∧77 ↔ ("L"∧77)∨300 ↔ (" "∧77)∨200
("E"∧77)∨100 ↔ "R"∧77 ↔ ("R"∧77)∨300
("O"∧77)∨200 ↔ ("R"∧77)∨100 ↔ " "∧77
0 ↔ 0 ↔ 0 ↔ 0

   LOC 2272
	0	;This is for a block of zeros
END